/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Stubs;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.nio.channels.ClosedByInterruptException;
import java.util.Scanner;

/**
 *
 * @author Murilo
 */
public class StubCliente {

    private int NumeroConta;
    private String Senha;
    private double Saldo;
    private double ValorSaque;
    private String Mensagem;
    private int Acao;

    public StubCliente(int NumeroConta) {
        this.NumeroConta = NumeroConta;
    }

    public StubCliente(int NumeroConta, String Senha) {
        this.NumeroConta = NumeroConta;
        this.Senha = Senha;
    }

    public int getNumeroConta() {
        return NumeroConta;
    }

    public StubCliente(int NumeroConta, String Senha, double ValorSaque) {
        this.NumeroConta = NumeroConta;
        this.Senha = Senha;
        this.ValorSaque = ValorSaque;
    }

    public int getAcao() {
        return Acao;
    }

    public void setAcao(int Acao) {
        this.Acao = Acao;
    }

    public StubCliente(String Senha, double Saldo) {
        this.Senha = Senha;
        this.Saldo = Saldo;
    }

    public String getSenha() {
        return Senha;
    }

    public void setSenha(String Senha) {
        this.Senha = Senha;
    }

    public double getSaldo() {
        return Saldo;
    }

    public void setSaldo(double Saldo) {
        this.Saldo = Saldo;
    }

    public String getMensagem() {
        return Mensagem;
    }

    public void setMensagem(String Mensagem) {
        this.Mensagem = Mensagem;
    }

    public void Conectar() {
        try {
            System.out.println("Abrindo conexão com o servidor....");
            Socket client_socket = new Socket("localhost", 5000);
            System.out.println("Conectado ao servidor");

            DataOutputStream canal_saida = new DataOutputStream(client_socket.getOutputStream());
            DataInputStream canal_entrada = new DataInputStream(client_socket.getInputStream());

            //primeira mensagem é para ver qual ação foi tomada pelo cliente
            canal_saida.writeInt(this.Acao);

            //Se Ação for 2 ele irá criar a conta
            if (this.Acao == 2) {
                canal_saida.writeUTF(Senha);
                canal_saida.writeDouble(Saldo);
                String StrEntrada = canal_entrada.readUTF();
                int NumeroContaCriada = canal_entrada.readInt();
                System.out.println(StrEntrada);
                if (!StrEntrada.equals("Sua conta foi criada!!!")) {
                    System.out.println("Finalizando o cliente");
                    this.Mensagem = "Erro Ao criar a conta.";
                    throw new Exception("Erro Ao criar a conta.");
                }else{
                    this.Mensagem = "Sua conta foi criada!!!";
                    this.NumeroConta = NumeroContaCriada;
                }
               //Senao ação igual a 1 ele vai verificar o saldo como gerente
            } else if (this.Acao == 1) {
                canal_saida.writeInt(NumeroConta);
                try{
                    String SaldoAtual = canal_entrada.readUTF();
                    this.Mensagem = SaldoAtual;
                    Double.parseDouble(SaldoAtual);
                }catch(NumberFormatException ex){
                    this.Mensagem = "Número de Conta Inválido";
                    throw new Exception("Não é um numero valido.");
                }catch(Exception ex){
                    this.Mensagem = "Não é um numero valido.";
                    throw new Exception("Não é um numero valido.");
                }
            //se acao 3 ele verifica saldo como cliente
            }else if(this.Acao == 3){
                canal_saida.writeInt(NumeroConta);
                canal_saida.writeUTF(Senha);
                try{
                    String SaldoAtual = canal_entrada.readUTF();
                    this.Mensagem = SaldoAtual;
                    
                    if(SaldoAtual.equals("Conta Inválida.")){
                        this.Mensagem = "Essa Conta não existe.";
                    }else if(SaldoAtual.equals("Senha inválida")){
                        this.Mensagem = "Senha inválida";
                    }else{
                        Double.parseDouble(SaldoAtual);
                    }
                }catch(NumberFormatException ex){
                    this.Mensagem = "Número de Conta Inválido";
                    throw new Exception("Não é um numero valido.");
                }catch(Exception ex){
                    this.Mensagem = "Não é um numero valido.";
                    throw new Exception("Não é um numero valido.");
                }
                //se acao 4 é saque
            }else if(this.Acao == 4){
                canal_saida.writeInt(NumeroConta);
                canal_saida.writeUTF(Senha);
                canal_saida.writeDouble(ValorSaque);
                String StrEntrada = canal_entrada.readUTF();
                if(StrEntrada.equals("Conta Inválida.")){
                    this.Mensagem = "Conta Inválida.";
                }else if(StrEntrada.equals("Valor muito Alto.")){
                    this.Mensagem = "Valor de saque muito Alto.";
                }else if(StrEntrada.equals("Senha Inválida")){
                    this.Mensagem = "Senha Inválida";
                }else if(StrEntrada.equals("Saldo Insuficiente")){
                    this.Mensagem = "Saldo Insuficiente";
                }else{
                    this.Mensagem = "Saque realizado";
                }
            }


            System.out.println("Fim do cliente");

            canal_entrada.close();
            canal_saida.close();
            client_socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
